package dominioDoProblema;

import java.util.List;

import dominioDaSolucao.Quadrado;

public class Tabuleiro extends MatrizDeQuadrados {

	private static final long serialVersionUID = 1L;

	public Tabuleiro(int altura, int largura) {
		super(altura, largura);
	}
	
	public void removerLinha(int linha) {
		for (int lin = linha; lin >= 0; lin--) {
			for (int col = 0; col < largura; col++) {
				if (!(lin < 0)) {//
					String nomeJogador = getQuadrado(lin-1, col).getNomeJogador();
					int numeroCor = getQuadrado(lin - 1, col).getCor();
					boolean ocupado = getQuadrado(lin - 1, col).isOcupado();
					
					if (nomeJogador != null){
						preencher(lin, col, nomeJogador, numeroCor, ocupado);
						resetArea(lin -1, col);
					} else {
						preencher(lin, col, null, -1, false);
						preencher(lin-1, col, null, -1, false);
					}
				} else {
					Quadrado quad = new Quadrado(lin, col);
					setQuadrado(lin, col, quad);
				}
			}
		}

	}

	
	
	public String verificaQuemEhVencedor(String jogador1, String jogador2) {
		int ptsJogador1 = 0;
		int ptsJogador2 = 0;
		for (int col = 0; col < largura; col++) {
			boolean ocupado = getQuadrado(1, col).isOcupado();
			
			if (ocupado) {
				for (int lin = 1; lin <= altura; lin++) {
					
					ocupado = getQuadrado(lin-1, col).isOcupado();
					if (ocupado) {
						boolean jog1 = getQuadrado(lin-1, col).getNomeJogador().equals(jogador1);
						boolean jog2 = getQuadrado(lin-1, col).getNomeJogador().equals(jogador2);
						if (jog1) {
							ptsJogador1++;
						} else if (jog2) {
							ptsJogador2++;
						}
					}
				}
			}
		}
		if (ptsJogador1 > ptsJogador2) {
			return jogador2;
		} else if (ptsJogador1 < ptsJogador2) {
			return jogador1;
		} else if (ptsJogador1 > 0 && (ptsJogador1 == ptsJogador2)) {
			return "empatou";
		} else {
			return null;
		}
	}

	public boolean verificaSePosicaoEhValida(Quadrado quadrado, Tetramino tetramino, int orientacao) {
		boolean isValida = true;
		List<Quadrado> lista = tetramino.gerarReferencias(quadrado, orientacao);
		if (lista.size() == 3) {
			for (Quadrado quad : lista) {
				boolean ocupado = quad.isOcupado();
				if (ocupado) {
					isValida = !quad.isOcupado(); // false
					List<Quadrado> quadrados = tetramino.getQuadrados();
					for (Quadrado quad2 : quadrados) {
						boolean mesmaReferencia = quad.getXRef() == quad2.getXRef() && quad.getYRef() == quad2.getYRef();
						if (mesmaReferencia) {
								isValida = quad.isOcupado();
						}
					}
					if (quad.isOcupado() && !isValida) {
						break;
					}
				}
			}
		} else {
			isValida = false;
		}

		if (isValida) {
			tetramino.apagarAntigos();
		}
		return isValida;
	}

	public boolean verificaPosicaoValidaQuadradoReferencia(int x, int y,
			Tetramino tetramino, int movimento) {
		switch (tetramino.getTipo()) {
		case 0:
			switch (tetramino.getOrientacao()) {
			case 1:
				if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else {
					return true;
				}
			default:
				return true;
			}
		case 1:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 2) {
					return !getQuadrado(x - 1, y).isOcupado();
				} else {
					return true;
				}
			default:
				return true;
			}
		case 2:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 1:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			}
		case 3:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else {
					return true;
				}
			case 1:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			}
		case 4:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 1:
				if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			}
		case 5:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 1:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			}
		case 6:
			switch (tetramino.getOrientacao()) {
			case 0:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			case 1:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			case 2:
				if (movimento == 1) {
					return !getQuadrado(x, y + 1).isOcupado();
				} else if (movimento == 2) {
					return !getQuadrado(x, y - 1).isOcupado();
				} else {
					return true;
				}
			case 3:
				if (movimento == 3) {
					return !getQuadrado(x + 1, y).isOcupado();
				} else {
					return true;
				}
			}
		default:
			return false;
		}
	}

	public void posicionarTetramino(String nomeJogador, int x, int y, int tipo,
			int orientacao, int cor) {

		Quadrado ref = new Quadrado(x, y);
		Tetramino tetramino = new Tetramino(ref, this, nomeJogador, tipo,
				orientacao, cor);
		List <Quadrado> quadrados = tetramino.getQuadrados();
		
		for (Quadrado quadrado : quadrados) {
			x = quadrado.getXRef();
			y = quadrado.getYRef();
			preencher(x, y, nomeJogador, cor, true);
		}
		x = tetramino.getXRef();
		y = tetramino.getYRef();
		preencher(x, y, nomeJogador, cor, true);
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public void verificaSeAlgumaLinhaEstaCompleta() {
		for (int altura = 0; altura < this.altura; altura++) {
			boolean linhaCompleta = true;
			for (int largura = 0; largura < this.largura; largura++) {
				if (!getQuadrado(altura, largura).isOcupado()) {
					linhaCompleta = false;
				}
			}
			if (linhaCompleta) {
				removerLinha(altura);
			}
		}
	}
}